package com.efast.dmom.aps.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.efast.dmom.aps.bean.Bom;
import com.efast.dmom.aps.bean.BomItem;
import com.efast.dmom.aps.bean.PlanOrderPartAnalysisResult;
import com.efast.dmom.aps.bean.PlanOrderPartAnalysisResultItem;
import com.efast.dmom.aps.bean.PlanOrder;
import com.efast.dmom.aps.constant.ServiceConstants;
import com.efast.dmom.aps.datahandlers.HomogeneityAnalysisDataHandler;
import com.efast.dmom.aps.exception.APSException;
import com.efast.dmom.aps.service.HomogeneityAnalysisService;
import com.efast.dmom.aps.service.PlanOrderService;
import com.efast.dmom.aps.util.SpringWebUtils;
import com.efast.dmom.aps.util.TimeUtil;

@Service
public class HomogeneityAnalysisServiceImpl implements HomogeneityAnalysisService {

	@Autowired
	private PlanOrderService planOrderService;

	@Autowired
	HomogeneityAnalysisDataHandler homogeneityAnalysisDataHandler = null;

	private List<Bom> bomList = new ArrayList<Bom>();

	private List<BomItem> bomItemList = new ArrayList<BomItem>();

	@Override
	public void homogeneityAnalysis() {
		// TODO Auto-generated method stub
		
	}

//	private Map<String, Integer> inventoryMap = new HashMap<String, Integer>();
//
//	@Override
//	public void homogeneityAnalysis() throws APSException {
//		// 按订单交期+订单紧急度获取订单
//		List<PlanOrder> planOrderList = planOrderService.getUnbroadcastPlanOrders(ServiceConstants.APS_PLAN_ORDER_STATUS_BROADCAST);
//		// 获取库存物料号数量
//		inventoryMap = homogeneityAnalysisDataHandler.selectMaterialInventory();
//		// 获取所有bom数据
//		bomList = homogeneityAnalysisDataHandler.selectAllBomData();
//		// 获取所有bom item数量
//		bomItemList = homogeneityAnalysisDataHandler.selectAllBomItemData();
//		
//		if (planOrderList != null && planOrderList.size() > 0) {
//			for (PlanOrder planOrderData : planOrderList) {
//				HomogeneityAnalysisResult homogeneityAnalysisResult = new HomogeneityAnalysisResult();
//				// 通过该计划的成品料号获取该计划下的bom及bom item数量
//				Bom headBom = this.getHeadBomByMaterial(planOrderData.getPartNo());
//				if (headBom != null) {
//					homogeneityAnalysisResult.setPlanOrderId(planOrderData.getId());
//					homogeneityAnalysisResult.setPlanOrderNo(planOrderData.getOrderNumber());
//					homogeneityAnalysisResult.setPartNo(planOrderData.getPartNo());
//					homogeneityAnalysisResult.setPartDesc(planOrderData.getPartDesc());
//					homogeneityAnalysisResult.setQty(planOrderData.getQuantity());
//					homogeneityAnalysisResult.setPlanOfflineDate(planOrderData.getPlanOfflineDate());
//					homogeneityAnalysisResult.setPriority(planOrderData.getPriority());
//					homogeneityAnalysisResult.setAnalyzeTime(TimeUtil.getLocalDateTime());
//					homogeneityAnalysisResult.setCreationTime(TimeUtil.getLocalDateTime());
//					homogeneityAnalysisResult.setCreator(SpringWebUtils.getRequestUser());
//					List<HomogeneityAnalysisResultItem> resultItemList = new ArrayList<HomogeneityAnalysisResultItem>();
//					Map<String, Integer> beforeInventoryMap = new HashMap<String, Integer>();
//					for (Map.Entry<String, Integer> entry : inventoryMap.entrySet()) {
//						beforeInventoryMap.put(entry.getKey(), entry.getValue());
//					}
//					List<HomogeneityAnalysisResultItem> recursionResultItemList = this
//							.getHomogeneityAnalysisResultItemList(headBom, planOrderData.getQuantity(), resultItemList);
//					
//					if (recursionResultItemList != null && recursionResultItemList.size() > 0) {
//						boolean flag = true;
//						for (HomogeneityAnalysisResultItem data : recursionResultItemList) {
//							if (data.getMaterialType().equals(ServiceConstants.APS_BOM_MATERIAL_RAWMATERIAL)
//									&& data.getIsSatisfy() == 0) {
//								flag = false;
//							}
//						}
//						if (!flag) {
//							homogeneityAnalysisResult.setIsSatisfy(0);
//							for (HomogeneityAnalysisResultItem data : recursionResultItemList) {
//								for (Map.Entry<String, Integer> entry : inventoryMap.entrySet()) {
//									if (entry.getKey().equals(data.getMaterialCode())) {
//										int addQty = entry.getValue() + data.getMaterialDemandQty();
//										inventoryMap.put(entry.getKey(), addQty);
//									}
//								}
//							}
//						} else {
//							homogeneityAnalysisResult.setIsSatisfy(1);
//						}
//						// 合并相同类型的物料数据
//						for (int i = 0; i < recursionResultItemList.size(); i++) {
//							for (int j = i + 1; j < recursionResultItemList.size(); j++) {
//								if (recursionResultItemList.get(i).getMaterialCode()
//										.equals(recursionResultItemList.get(j).getMaterialCode())) {
//									recursionResultItemList.get(i)
//											.setMaterialDemandQty(recursionResultItemList.get(i).getMaterialDemandQty()
//													+ recursionResultItemList.get(j).getMaterialDemandQty());
//									if (recursionResultItemList.get(i).getIsSatisfy() == 1
//											&& recursionResultItemList.get(j).getIsSatisfy() == 1) {
//										recursionResultItemList.get(i).setIsSatisfy(1);
//									} else {
//										recursionResultItemList.get(i).setIsSatisfy(0);
//									}
//									recursionResultItemList.remove(j);
//								}
//							}
//						}
//						homogeneityAnalysisDataHandler.insertHomogeneityAnalysisResult(homogeneityAnalysisResult);
//						for (HomogeneityAnalysisResultItem data : recursionResultItemList) {
//							for (Map.Entry<String, Integer> entry : beforeInventoryMap.entrySet()) {
//								data.setHomogeneityResultId(homogeneityAnalysisResult.getId());
//								if (entry.getKey().equals(data.getMaterialCode())) {
//									data.setVirtualMaterialInventoryQty(entry.getValue());
//									data.setMaterialDifferenceQty(entry.getValue() - data.getMaterialDemandQty());
//								}
//							}
//						}
//						homogeneityAnalysisDataHandler.insertResultItemList(recursionResultItemList);
//					} else {
//						new APSException("该成品不存在Bom树！");
//					}
//				} else {
//					new APSException("bom中未找到对应成品料号！");
//				}
//			}
//		}
//	}
//
//	// 建立一个递归，用于递归bom
//	public List<HomogeneityAnalysisResultItem> getHomogeneityAnalysisResultItemList(Bom bom, int qty,
//			List<HomogeneityAnalysisResultItem> resultItemList) {
//		if (bom != null) {
//			List<Bom> sonBomList = this.getSonBomByBomId(bom.getInnerEntity().getId());
//			List<BomItem> bomItemDataList = this.getBomItemByBomId(bom.getInnerEntity().getId());
//			boolean flag = true;
//			if (sonBomList == null) {
//				flag = false;
//			}
//			if (bomItemDataList != null && bomItemDataList.size() > 0) {
//				for (BomItem bomItemData : bomItemDataList) {
//					for (Map.Entry<String, Integer> entry : inventoryMap.entrySet()) {
//						if (entry.getKey().equals(bomItemData.getMaterialCode())
//								&& entry.getValue() >= bomItemData.getQty() * qty) {
//							HomogeneityAnalysisResultItem resultItemData = this
//									.addHomogeneityAnalysisResultItemByBomItem(bomItemData, entry.getValue(),
//											bomItemData.getQty());
//							resultItemData.setIsSatisfy(1);
//							resultItemList.add(resultItemData);
//							int availableQty = entry.getValue() - bomItemData.getQty() * qty;
//							inventoryMap.put(entry.getKey(), availableQty);
//						} else if (entry.getKey().equals(bomItemData.getMaterialCode())
//								&& entry.getValue() < bomItemData.getQty() * qty) {
//							HomogeneityAnalysisResultItem resultItemData = this
//									.addHomogeneityAnalysisResultItemByBomItem(bomItemData, entry.getValue(),
//											bomItemData.getQty());
//							resultItemData.setIsSatisfy(0);
//							resultItemList.add(resultItemData);
//							int availableQty = entry.getValue() - bomItemData.getQty() * qty;
//							inventoryMap.put(entry.getKey(), availableQty);
//						}
//					}
//				}
//			}
//			if (!flag) {
//				return resultItemList;
//			}
//			if (sonBomList != null && sonBomList.size() > 0) {
//				for (Bom sonBomData : sonBomList) {
//					for (Map.Entry<String, Integer> entry : inventoryMap.entrySet()) {
//						if (entry.getKey().equals(sonBomData.getInnerEntity().getMaterialId())
//								&& entry.getValue() >= sonBomData.getInnerEntity().getQty() * qty) {
//							HomogeneityAnalysisResultItem resultItemData = this.addHomogeneityAnalysisResultItemByBom(
//									sonBomData, entry.getValue(), sonBomData.getInnerEntity().getQty());
//							resultItemData.setIsSatisfy(1);
//							resultItemList.add(resultItemData);
//							int availableQty = entry.getValue() - sonBomData.getInnerEntity().getQty() * qty;
//							inventoryMap.put(entry.getKey(), availableQty);
//						} else if (entry.getKey().equals(sonBomData.getInnerEntity().getMaterialCode())
//								&& entry.getValue() < sonBomData.getInnerEntity().getQty() * qty) {
//							HomogeneityAnalysisResultItem resultItemData = this.addHomogeneityAnalysisResultItemByBom(
//									sonBomData, entry.getValue(), sonBomData.getInnerEntity().getQty());
//							resultItemData.setIsSatisfy(0);
//							int availableQty = entry.getValue() - sonBomData.getInnerEntity().getQty() * qty;
//							inventoryMap.put(entry.getKey(), availableQty);
//							getHomogeneityAnalysisResultItemList(sonBomData,
//									sonBomData.getInnerEntity().getQty() * qty - entry.getValue(), resultItemList);
//						}
//					}
//				}
//			}
//		}
//		return resultItemList;
//	}
//
//	// 通过成品料号获取bom
//	public Bom getHeadBomByMaterial(String materialCode) {
//		if (bomList != null && bomList.size() > 0) {
//			for (Bom bomData : bomList) {
//				if (bomData.getMaterialCode().equals(materialCode)
//						&& bomData.getInnerEntity().getLevel() == ServiceConstants.APS_BOM_HEADNODE_LEVEL
//						&& bomData.getInnerEntity().getParentId() == ServiceConstants.APS_BOM_HEADNODE_PARENTID
//						&& bomData.getMaterialType().equals(ServiceConstants.APS_BOM_MATERIAL_FINISHPRODUCTION)) {
//					return bomData;
//				}
//			}
//		}
//		return null;
//	}
//
//	// 通过bomId获取该成品/半成品下的半成品
//	public List<Bom> getSonBomByBomId(long bomId) {
//		List<Bom> sonBomList = new ArrayList<Bom>();
//		if (bomList != null && bomList.size() > 0) {
//			for (Bom bom : bomList) {
//				if (bom.getInnerEntity().getParentId() == bomId
//						&& bom.getInnerEntity().getMaterialType().equals(ServiceConstants.APS_BOM_MATERIAL_SEMIPRODUCTION)) {
//					sonBomList.add(bom);
//				}
//			}
//		}
//		return sonBomList;
//	}
//
//	// 通过bomId获取bom下的bomItem
//	public List<BomItem> getBomItemByBomId(long bomId) {
//		List<BomItem> bomItemDataList = new ArrayList<BomItem>();
//		if (bomItemList != null && bomItemList.size() > 0) {
//			for (BomItem bomItemData : bomItemList) {
//				if (bomItemData.getBomId() == bomId) {
//					bomItemDataList.add(bomItemData);
//				}
//			}
//		}
//		return bomItemDataList;
//	}
//
//	public HomogeneityAnalysisResultItem addHomogeneityAnalysisResultItemByBom(Bom bom, int value, int qty) {
//		HomogeneityAnalysisResultItem resultItemData = new HomogeneityAnalysisResultItem();
//		resultItemData.setMaterialId(bom.getInnerEntity().getMaterialId());
//		resultItemData.setMaterialCode(bom.getInnerEntity().getMaterialCode());
//		resultItemData.setMaterialType(bom.getInnerEntity().getMaterialType());
//		resultItemData.setMaterialName(bom.getInnerEntity().getMaterialName());
//		resultItemData.setUnit(bom.getInnerEntity().getUnit());
//		resultItemData.setMaterialDemandQty(bom.getInnerEntity().getQty() * qty);
//		resultItemData.setVirtualMaterialInventoryQty(value);
//		resultItemData.setMaterialDifferenceQty(value - bom.getInnerEntity().getQty() * qty);
//		resultItemData.setCreationTime(TimeUtil.getLocalDateTime());
//		resultItemData.setCreator(SpringWebUtils.getRequestUser());
//		return resultItemData;
//	}
//
//	public HomogeneityAnalysisResultItem addHomogeneityAnalysisResultItemByBomItem(BomItem bomItem, int value,
//			int qty) {
//		HomogeneityAnalysisResultItem resultItemData = new HomogeneityAnalysisResultItem();
//		resultItemData.setMaterialId(bomItem.getMaterialId());
//		resultItemData.setMaterialCode(bomItem.getMaterialCode());
//		resultItemData.setMaterialType(bomItem.getMaterialType());
//		resultItemData.setMaterialName(bomItem.getMaterialName());
//		resultItemData.setUnit(bomItem.getUnit());
//		resultItemData.setMaterialDemandQty(bomItem.getQty() * qty);
//		resultItemData.setVirtualMaterialInventoryQty(value);
//		resultItemData.setMaterialDifferenceQty(value - bomItem.getQty() * qty);
//		resultItemData.setCreationTime(TimeUtil.getLocalDateTime());
//		resultItemData.setCreator(SpringWebUtils.getRequestUser());
//		return resultItemData;
//	}
}
